/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import controller.Conexao;
import controller.ContaReceber;
import controller.Estoque;
import controller.Produto;
import controller.Venda;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Alcivando
 */
public class VendaDAO {

    Venda venda = new Venda();
    private Connection connection;

    public VendaDAO() throws SQLException {
        this.connection = Conexao.getConnection();

    }

    public int retornaProximoID() throws SQLException {
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(\"codVenda\") from vendas;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        return codigo.get(0);
    }

    public void adiciona(Venda venda, ArrayList<Produto> listaProdutos) throws SQLException {

        try{
        //adiciona o codigo ao proximo cliente a ser inserido
        venda.setCodVenda(retornaProximoID());

        // insere os dados do cliente com a conexao para o banco de dados.
        String sql = "insert into vendas values (?,?,?,?,?)";
        PreparedStatement stmt = connection.prepareStatement(sql);

        stmt.setInt(1, venda.getCodVenda());
        stmt.setInt(2, venda.getCodCliente());
        stmt.setString(3, venda.getTipoPagamento());
        stmt.setString(4, venda.getData());
        stmt.setDouble(5, venda.getTotal());
        // busca os campos preenchidos na classe de Clientes.

        stmt.execute();



        for (Produto p : listaProdutos) {
            sql = "insert into \"itensVenda\" values (?,?)";
            stmt = connection.prepareStatement(sql);

            stmt.setInt(1, venda.getCodVenda());
            stmt.setInt(2, p.getCodProduto());

            stmt.execute();
            stmt.close();

            if (venda.getTipoPagamento() == "Á prazo") {

                ClienteDAO cdao = new ClienteDAO();

                cdao.adicionarValorConta(venda.getCodCliente(), p.getPreco() * p.getQuantidade());

                ContaReceberDAO contadao = new ContaReceberDAO();

                ContaReceber conta = new ContaReceber();

                conta.setCodCliente(venda.getCodCliente());
                conta.setValorParcela(p.getPreco() * p.getQuantidade()/venda.getnParcelas());
                conta.setVencimento(venda.getVencimentoParcela());
                conta.setnParcela(venda.getnParcelas());

                contadao.adiciona(conta);

            }

            EstoqueDAO edao = new EstoqueDAO();
            
            Estoque e = new Estoque();

            e.setCodProduto(p.getCodProduto());
            e.setDataEntrada(venda.getData());
            e.setQuantidade(p.getQuantidade());

            edao.removerQtdProduto(e);

            

        }

        
        

        }catch(Exception ex){
            JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage(), "Erro", 0);
        }
}

    public ArrayList<Venda> RetornaTodasVendas() {
        PreparedStatement comando;
        ArrayList<Venda> listaVenda = new ArrayList<Venda>();

        try {

            String sql = "SELECT * FROM vendas";
            comando = connection.prepareStatement(sql);
            ResultSet rs = comando.executeQuery(sql);

            while (rs.next()) {

                Venda venda = new Venda();

                venda.setCodVenda(rs.getInt("codVenda"));
                venda.setCodCliente(rs.getInt("codCliente"));

                venda.setTipoPagamento(rs.getString("tipoPagamento"));
                venda.setData(rs.getString("data"));
                venda.setTotal(rs.getDouble("total"));

                listaVenda.add(venda);

            }
            comando.close();

            return listaVenda;

        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public ArrayList<Produto> retornaProdutosVenda(int codVenda) {
        PreparedStatement comando;
        ArrayList<Produto> listaProduto = new ArrayList<Produto>();

        try {

            String sql = "SELECT \"codItem\" FROM \"itensVenda\" WHERE \"codVenda\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, codVenda);
            ResultSet rs = comando.executeQuery(sql);

            while (rs.next()) {

                Produto produto = new Produto();
                ProdutoDAO pdao = new ProdutoDAO();

                produto = pdao.retornaProdutoPorCodigo(rs.getInt("\"codItem\""));


                listaProduto.add(produto);

            }
            comando.close();

            return listaProduto;

        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public void remover(Venda venda) throws SQLException {
        PreparedStatement comando;
        try {
            String sql = "DELETE FROM vendas WHERE codVenda=?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, venda.getCodVenda());
            comando.execute();
            JOptionPane.showMessageDialog(null, "Removido com sucesso!", "Remorcao Concluída", 1);
            comando.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public ArrayList<Venda> retornaVendaPorProduto(int codProduto) {
        PreparedStatement comando;
        ArrayList<Venda> listaVenda = new ArrayList<Venda>();

        try {

            String sql = "SELECT vendas.* FROM \"itensVenda\", vendas WHERE \"itensVenda\".\"codVenda\" = vendas.\"codVenda\" and \"codItem\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, codProduto);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {
                Venda Venda = new Venda();

                Venda.setCodVenda(rs.getInt("codVenda"));
                Venda.setCodCliente(rs.getInt("codCliente"));

                Venda.setTipoPagamento(rs.getString("tipoPagamento"));
                Venda.setData(rs.getString("data"));

                Venda.setTotal(rs.getDouble("total"));
            }

            comando.close();
            return listaVenda;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public ArrayList<Venda> retornaVendaPorCliente(int codCliente) {
        PreparedStatement comando;
        ArrayList<Venda> listaVenda = new ArrayList<Venda>();

        try {

            String sql = "SELECT vendas.* FROM \"itensVenda\", vendas WHERE \"itensVenda\".\"codVenda\" = vendas.\"codVenda\" and \"codCliente\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, codCliente);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {
                Venda Venda = new Venda();

                Venda.setCodVenda(rs.getInt("codVenda"));
                Venda.setCodCliente(rs.getInt("codCliente"));

                Venda.setTipoPagamento(rs.getString("tipoPagamento"));
                Venda.setData(rs.getString("data"));

                Venda.setTotal(rs.getDouble("total"));
            }

            comando.close();
            return listaVenda;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public ArrayList<Venda> retornaVendaPorData(String data) {
        PreparedStatement comando;
        ArrayList<Venda> listaVenda = new ArrayList<Venda>();

        try {

            String sql = "SELECT vendas.* FROM \"itensVenda\", vendas WHERE \"itensVenda\".\"codVenda\" = vendas.\"codVenda\" and vendas.data = ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, data);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {
                Venda Venda = new Venda();

                Venda.setCodVenda(rs.getInt("codVenda"));
                Venda.setCodCliente(rs.getInt("codCliente"));

                Venda.setTipoPagamento(rs.getString("tipoPagamento"));
                Venda.setData(rs.getString("data"));

                Venda.setTotal(rs.getDouble("total"));
            }

            comando.close();
            return listaVenda;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public Venda retornaVendaPorCod(int codVenda) {
        PreparedStatement comando;

        try {

            String sql = "SELECT * FROM vendas WHERE \"codVenda\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, codVenda);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            Venda venda = new Venda();

            while (rs.next()) {


                venda.setCodVenda(rs.getInt("codVenda"));
                venda.setCodCliente(rs.getInt("codCliente"));

                venda.setTipoPagamento(rs.getString("tipoPagamento"));
                venda.setData(rs.getString("data"));


            }
            comando.close();
            return venda;


        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
}
